home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2004 April / Gamestar_61_2004-04_dvdb.iso / DVDStar / Editace / hltp.exe / {app} / Source Code / VirtualDub / sylia / VariableTable.cpp < prev    next >
C/C++ Source or Header  |  2003-10-01  |  1KB  |  70 lines

  1. #include <string.h>
  2.  
  3. #include "ScriptError.h"
  4.  
  5. #include "VariableTable.h"
  6.  
  7. VariableTable::VariableTable(int ht_size) : varheap(16384) {
  8.     long i;
  9.  
  10.     lHashTableSize    = ht_size;
  11.     lpHashTable        = new VariableTableEntry *[ht_size];
  12.  
  13.     for(i=0; i<lHashTableSize; i++)
  14.         lpHashTable[i] = 0;
  15. }
  16.  
  17. VariableTable::~VariableTable() {
  18.     delete[] lpHashTable;
  19. }
  20.  
  21.  
  22. long VariableTable::Hash(char *szName) {
  23.     long hc = 0;
  24.     char c;
  25.  
  26.     while(c=*szName++)
  27.         hc = (hc + 17) * (int)(unsigned char)c;
  28.  
  29.     return hc % lHashTableSize;
  30. }
  31.  
  32. VariableTableEntry *VariableTable::Lookup(char *szName) {
  33.     long lHashVal = Hash(szName);
  34.     VariableTableEntry *vte = lpHashTable[lHashVal];
  35.  
  36.     while(vte) {
  37.         if (!strcmp(vte->szName, szName))
  38.             return vte;
  39.  
  40.         vte = vte->next;
  41.     }
  42.  
  43.     return NULL;
  44. }
  45.  
  46. VariableTableEntry *VariableTable::Declare(char *szName) {
  47.     VariableTableEntry *vte;
  48.     long lHashVal = Hash(szName);
  49.     long lNameLen;
  50.  
  51.     lNameLen    = strlen(szName);
  52.  
  53.     vte            = Allocate(lNameLen);
  54.     vte->next    = lpHashTable[lHashVal];
  55.     vte->v        = CScriptValue();
  56.     strcpy(vte->szName, szName);
  57.  
  58.     lpHashTable[lHashVal] = vte;
  59.  
  60.     return vte;
  61. }
  62.  
  63. VariableTableEntry *VariableTable::Allocate(long lNameLen) {
  64.     VariableTableEntry *vte = (VariableTableEntry *)varheap.Allocate(sizeof(VariableTableEntry) + lNameLen);
  65.  
  66.     if (!vte) SCRIPT_ERROR(OUT_OF_MEMORY);
  67.  
  68.     return vte;
  69. }
  70.